Skip to content

test: verify model preset successor - #23

Draft
twoimo wants to merge 17 commits into
mainfrom
successor/model-preset-default-action-current
Draft

test: verify model preset successor#23
twoimo wants to merge 17 commits into
mainfrom
successor/model-preset-default-action-current

Conversation

@twoimo

@twoimo twoimo commented Jul 25, 2026

Copy link
Copy Markdown
Owner

Internal verification PR. The branch workflow rebuilds the three-file current-dev diff, runs focused preset regressions and the coding-agent check, then force-pushes only the verified product commit.

Yeachan-Heo and others added 7 commits July 25, 2026 04:27
…ispose flake (Yeachan-Heo#3144)

* test(sdk): make teardown ordering witness production-observable

The Phase 2 rewrite of "session teardown drains admitted direct gate
resolution" was accepted with a narrowed claim because a mutation probe
survived: replacing `await rt.waitForGateResolutionQuiescence()` with
`void ...` still passed. The test fully mocked `resolveGate`, so the
delayed operation never touched the real terminal controller, and it
released the resolver after a single setImmediate while `stopSession()`
was independently awaiting the native `pushFrameAndWait(session_closed)`
barrier — resolution therefore completed before teardown reached
detachment even without the quiescence await.

Now the test calls through the original `registerGateTerminalController`
and the original `resolveGate` (wrapping the latter only with a deferred
pre-terminalization gate), makes `pushFrameAndWait(session_closed)` an
explicit test-controlled pre-drain barrier, asserts the controller is
still attached at the quiescence point, then observes real accepted
terminalization and gate continuation before detachment.

Mutation-proved: the void-await mutation now FAILS at the pre-detachment
assertion (controllerAttached false). Passes 10/10 unmutated.

* test(runtime): poll for the TERM marker in the concurrent-dispose redteam

Caught live by the stabilization soak: main-nontag rehearsal run
30149261910 failed on shard 11 with

  (fail) process-lifecycle adversarial owned-process invariants >
         double and concurrent dispose share one settled result and
         issue one terminating signal
  expect(received).toHaveLength(expected)  Expected: 1  Received: 0

The child's TERM trap appends its marker asynchronously
(`trap 'echo term >> $tmp; exit 0' TERM`), so under shard load
`awaitExit` can return before that write lands and the single-sample
read observes an empty file. The file already has a `waitForAsync`
helper for exactly this shape; the marker assertion just wasn't using
it.

Polls for the single terminating signal before asserting, preserving
the original invariant (exactly one `term` line — not "at least one").

Verified: 15/15 reruns, 4x parallel contention clean, whole file 9/9,
typecheck and biome clean.

This test was NOT in the 62-suspect audit shortlist: it did not fail or
retry during the mined two-week window, so it is a genuinely new
observation the soak surfaced.

---------

Co-authored-by: Yeachan-Heo <yeachan-heo@gajae.dev>
`sh` runs a TERM trap only after the current foreground command returns.
With the child looping on `sleep 1` and `gracefulMs: 500`, dispose could
escalate to SIGKILL before the handler wrote its `term` marker, so the
one-terminating-signal assertion saw an empty file (observed in CI run
30149261910, coding-agent shard 11).

Shorten the loop interval to 0.05s and use the module's own
`DEFAULT_GRACEFUL_MS` (2000ms) so the trap has a deterministic window.
Under 18-worker CPU contention the old shape wins the race 8/20; the new
shape wins 20/20. All assertions are unchanged.

Also record the missing `## [Unreleased]` changelog entries for Yeachan-Heo#3109,
Yeachan-Heo#3127, and Yeachan-Heo#3131, found while auditing release scope after v0.11.9.
…turns (Yeachan-Heo#3147)

Lifecycle `session_shutdown` started `controller.stopCurrentSession(ctx)`
but discarded the promise, awaiting only `stopSession(id)`. Once startup
has settled the host is broker-visible and can accept `session.close`
while the startup handler's post-start `reconcileCurrentSession` is still
running. That reconciliation can mint a replacement notification-root
token; `ensureTelegramDaemon` then unregisters it asynchronously. Shutdown
could therefore return — and disposal exit — before that unregister's file
lock and atomic registry write settled, leaving a stale `sessions[id]` row
that the retained older token is correctly fenced from removing
(`unregisterNotificationRoot` rejects token mismatches by design).

Now shutdown snapshots `sessionStartPromises.has(id)` first and awaits the
settled controller stop after `stopSession` whenever startup was NOT
pending, so completed-start reconciliation and its replacement-token
cleanup are joined. The intentional nonblocking path is preserved exactly
where it matters: a genuinely pending startup entry (the `/notify on`
case) still leaves the controller stop fire-and-forget.

Surfaced by the flaky-CI stabilization soak. The regression test
"Telegram root release failure is retained and retried through lifecycle
shutdown" failed deterministically on darwin-arm64 at dev head while
Linux CI stayed green (run 30147146988, 34/34 shards) — a completion-
ordering divergence, not a `/var` canonicalization or native-addon issue:
both registry and notification-root paths are lexical `path.join` with no
realpath or case folding.

Verified on darwin-arm64: the previously-failing test now passes 10/10,
the whole sdk-host-wiring file is 72/72 (first fully green run of this
file on Darwin), and telegram daemon + btw-e2e are 463/463. The assertion
was kept intact rather than replaced with polling, which would have hidden
the lifecycle-return bug.

Co-authored-by: Yeachan-Heo <yeachan-heo@gajae.dev>
@twoimo twoimo closed this Jul 25, 2026
@twoimo twoimo reopened this Jul 25, 2026
@twoimo twoimo closed this Jul 25, 2026
@twoimo twoimo reopened this Jul 25, 2026
…eachan-Heo#3149)

Caught by the stabilization soak: main-nontag rehearsal run 30151115867
failed on shard 8 with

  (fail) session_start swallows startup plus owner-release failure
         without surfacing an extension error
  expect(surfaced).toEqual([])   received 1 surfaced error

The test used `mockRejectedValueOnce` on the SHARED prototypes
`NotificationServer.prototype.start` and `SessionSdkHost.prototype.stop`.
That is a one-shot global: a peer test scheduled concurrently in the same
shard can consume the single rejection first. When that happens this
test's own `start()` resolves, so `startSession` never reaches the
`stopSession` catch that sets `suppressExtensionError`
(src/sdk/bus/index.ts:4407-4420), and the startup error surfaces through
`session_start` instead of being swallowed.

Three separate tests in this file arm one-shot rejections on the same two
prototypes, so the interference is cross-test within a shard rather than
a missing restore — every one of them restores correctly.

Replaces both one-shots with per-test guarded implementations that reject
only on this test's first call and then delegate to the real method,
preserving the existing assertions (including
`expect(hostStop).toHaveBeenCalledTimes(2)`, which is what makes the
"first call rejects" semantics load-bearing).

Verified on darwin-arm64: 10/10 targeted reruns, 6x concurrent whole-file
runs with zero failures, whole file 72/72, typecheck and biome clean.

Co-authored-by: Yeachan-Heo <yeachan-heo@gajae.dev>
@twoimo twoimo closed this Jul 25, 2026
@twoimo twoimo reopened this Jul 25, 2026
Yeachan-Heo and others added 4 commits July 25, 2026 20:58
…#3139) (Yeachan-Heo#3146)

The release CI default was narrowed to `contents: read` in Yeachan-Heo#3136 with
`publish` retaining the sole job-level `contents: write` override, but no
automated policy test protected that invariant. `dev-ci.yml` also had no
explicit permission block and inherited the repository default.

Add `scripts/check-workflow-permissions.ts`: a deterministic offline
default-deny evaluator plus CLI that parses committed workflow YAML and
requires every workflow to declare a least-privilege `permissions` block.
Write scopes are denied everywhere except one explicit allowlist triple
(ci.yml / publish / contents), and the three known workflows must declare
exactly `contents: read`. Violations name workflow, job, permission path,
actual, and expected.

Codify `contents: read` on `dev-ci.yml` after auditing its jobs: they only
check out, install, test, and exchange artifacts through the Actions
artifact API, with no `git push`, `gh` CLI, `secrets.*`, or release/PR
mutation, so no write-scoped token is required.

Back it with real-YAML mutation proofs that read committed workflows from
disk, mutate the parsed document, and re-evaluate -- covering workflow and
job `write`, `write-all`, extra scopes, deleted permission blocks, and
malformed job shapes. Route the regression through affected-path CI in both
the broad and targeted planners so workflow and CI-harness changes select it
alongside the existing release-policy suite, and pin the invariant in
`release-policy.test.ts` as well.

Refs Yeachan-Heo#3139

Co-authored-by: Yeachan-Heo <yeachan-heo@gajae.dev>
…/ resolver (Yeachan-Heo#3145)

Closes non-blocking follow-up from the Yeachan-Heo#3080 post-merge review: cleanup_pending marker asymmetry between the async gate and the sync resolver.

Reviewed exact head 90aa337 with durable MERGE_READY and green exact-head CI. Merged after post-merge Dev CI 30157160426 on 352a2c1 turned terminal green.
…o what shipped (Yeachan-Heo#3140)

Documentation-only correction of readiness claims from Yeachan-Heo#3080.

Exact-head MERGE_READY at 6cf2764 with green CI. Held during red/nonterminal post-merge gates; merged after Dev CI 30158413804 on 2317939 terminalized success.
…3070)

Exact-head MERGE_READY at 332942d with green CI. Merged after post-merge Dev CI 30158899514 on e108816 terminalized success.
@twoimo twoimo closed this Jul 25, 2026
@twoimo twoimo reopened this Jul 25, 2026
…eachan-Heo#3132)

`retryDelayMs()` honoured the server's `Retry-After` verbatim:

    if (Number.isFinite(seconds)) return Math.max(baseline, Math.max(0, seconds * 1000));

There was no upper bound, so a hostile or misconfigured endpoint could stall
the usage fetch for as long as it liked. Verified: `Retry-After: 86400` made
the provider sleep 86_400_000ms (24 hours), and the HTTP-date form did the
same (86_399_386ms). The sleep is abort-aware, but with no signal — or a
long-lived one — the usage refresh simply hangs, and auth-storage ranks
credentials off this call.

Every sibling path in the repo already bounds this:
  - utils/fetch-retry.ts  DEFAULT_MAX_DELAY_MS = 60_000 (+ fail-fast above cap)
  - providers/openai-bounded-rate-limits.ts  OPENAI_RETRY_DELAY_CAP_MS = 60_000
  - session/agent-session.ts  maxAcceptableDelayMs = 30_000
Only the Claude usage path was missing a ceiling.

Fix: add MAX_RETRY_DELAY_MS = 60_000 and clamp through clampRetryDelay(),
which also drops non-finite/negative hints. 60s matches the existing
convention and preserves both pre-existing assertions exactly
(`Retry-After: 1` → 1000, `Retry-After: 60` → 60_000).

Regression coverage (test/claude-usage-retry.test.ts): absurd numeric
Retry-After, absurd HTTP-date Retry-After, and a negative Retry-After. The
first two fail against the unfixed code (received 86_400_000 / 86_399_386,
expected 60_000).

Gates: claude-usage-retry (11 pass), usage suite (28 pass across 5 files),
tsc --noEmit clean.

Co-authored-by: dmae97 <dmae97@users.noreply.github.com>
@twoimo twoimo closed this Jul 25, 2026
@twoimo twoimo reopened this Jul 25, 2026
@github-actions

github-actions Bot commented Jul 25, 2026

Copy link
Copy Markdown

Superseded diagnostic: the first model-successor run failed because the Linux native addon had not been built before selector tests. The unified verifier now builds packages/natives before running the focused suites.

@twoimo twoimo closed this Jul 25, 2026
@twoimo twoimo reopened this Jul 25, 2026
Owner-approved MERGE_READY at exact head 4caf43c with green CI (31 checks). Merged after post-Yeachan-Heo#3132 Dev CI 30159910672 on 77c9a60 terminalized success. Yeachan-Heo#3134 became dirty and was skipped under one-at-a-time sequencing.
@github-actions

Copy link
Copy Markdown

MODEL_SUCCESSOR_VERIFIED

@twoimo twoimo closed this Jul 25, 2026
@twoimo twoimo reopened this Jul 25, 2026
@github-actions

Copy link
Copy Markdown

SUCCESSOR_VERIFICATION_FAILED

branch=successor/model-preset-default-action-current
outcome=failure
marker=(none)

   Compiling semver v1.0.28
   Compiling x11rb-protocol v0.13.2
   Compiling napi-derive-backend v5.1.1
   Compiling encoding_rs_io v0.1.7
   Compiling toml v1.1.2+spec-1.1.0
   Compiling napi-sys v3.2.2
   Compiling ignore v0.4.27
   Compiling x11rb v0.13.2
   Compiling quantette v0.5.1
   Compiling brush-builtins v0.2.0 (/home/runner/work/gajae-code/gajae-code/work/crates/brush-builtins-vendored)
   Compiling wl-clipboard-rs v0.9.3
   Compiling html5ever v0.39.0
   Compiling brush-parser v0.3.0
   Compiling pi-natives v0.11.10 (/home/runner/work/gajae-code/gajae-code/work/crates/pi-natives)
   Compiling ast-grep-core v0.39.9
   Compiling tokio-tungstenite v0.24.0
   Compiling sha2 v0.10.9
   Compiling filedescriptor v0.8.3
   Compiling hmac v0.12.1
   Compiling lru v0.16.4
   Compiling fancy-regex v0.16.2
   Compiling bincode v1.3.3
   Compiling memmap2 v0.9.11
   Compiling serial2 v0.2.37
   Compiling astral-tl v0.7.11
   Compiling html-escape v0.2.14
   Compiling ctor v1.0.7
   Compiling percent-encoding v2.3.2
   Compiling hashbrown v0.14.5
   Compiling base64 v0.22.1
   Compiling nohash-hasher v0.2.0
   Compiling similar v3.1.1
   Compiling xxhash-rust v0.8.16
   Compiling shell-words v1.1.1
   Compiling portable-pty v0.9.0
   Compiling pi-iso v0.11.10 (/home/runner/work/gajae-code/gajae-code/work/crates/pi-iso)
   Compiling dashmap v6.2.1
   Compiling html-to-markdown-rs v2.30.0
   Compiling arboard v3.6.1
   Compiling napi-derive v3.5.9
   Compiling syntect v5.3.0
   Compiling grep-searcher v0.1.16
   Compiling gjc-sdk v0.11.10 (/home/runner/work/gajae-code/gajae-code/work/crates/gjc-sdk)
   Compiling pi-ast v0.11.10 (/home/runner/work/gajae-code/gajae-code/work/crates/pi-ast)
   Compiling icy_sixel v0.5.0
   Compiling grep-regex v0.1.14
    Finished `ci` profile [optimized + debuginfo] target(s) in 4m 24s
Normalizing native addon filename: pi_natives.linux-x64-gnu.node → pi_natives.linux-x64-modern.node
Generated 83 explicit ESM exports in index.js, fixed 9 const enums in index.d.ts
Build complete.
Checked 2 files in 123ms. No fixes applied.
bun test v1.3.14 (0d9b296a)

::group::packages/coding-agent/test/model-selector-profiles.test.ts:
(pass) model selector profiles > renders preset landing above model rows [17.45ms]
(pass) model selector profiles > provider focus does not auto-expand until right arrow [21.71ms]
(pass) model selector profiles > up and down navigation stays on provider rows while collapsed [12.75ms]
(pass) model selector profiles > landing header shows the session's current preset, model, and role assignments [13.20ms]
(pass) model selector profiles > landing header reflects the active fallback model snapshot [11.99ms]
(pass) model selector profiles > enter toggles a usable provider group's expansion [11.57ms]
(pass) model selector profiles > preset search keeps first typed character before subsequent input [14.74ms]
(pass) model selector profiles > initial search input appends new typing at the end [11.79ms]
(pass) model selector profiles > temporary-only mode hides Profiles [12.79ms]
(pass) model selector profiles > active profile makes DEFAULT badge follow runtime model instead of stored default [12.16ms]
(pass) model selector profiles > without active profile DEFAULT badge follows persisted default model [10.82ms]
(pass) model selector profiles > direct fallback chains make the runtime fallback both Current and DEFAULT [12.92ms]
(pass) model selector profiles > persisted session fallback chains make the active head both Current and DEFAULT [12.35ms]
(pass) model selector profiles > Apply for this session activates profile through setModelTemporary [15.95ms]
(pass) model selector profiles > Set as default persists and flushes modelProfile.default [12.63ms]
(pass) model selector profiles > credential failure shows error and leaves model and overrides unchanged [11.11ms]
(pass) model selector profiles > settings Default Model Profile applies the profile live and persists it [12.00ms]
(pass) model selector profiles > settings Default Model Profile surfaces credential errors without switching [11.77ms]

::endgroup::

::group::packages/coding-agent/test/model-selector-profiles-redteam.test.ts:
(pass) model selector profile red-team > empty profile catalog omits Profiles section and does not crash [10.89ms]
(pass) model selector profile red-team > temporary-only mode hides Profiles even when profiles exist [12.17ms]
(pass) model selector profile red-team > user-overridden profile name appears once [12.27ms]
(pass) model selector profile red-team > profile actions default to persistence and retain session-only application [24.06ms]
(pass) model selector profile red-team > custom profile action indices retain rename and delete [25.04ms]
(pass) model selector profile red-team > controller persists only Set as default and leaves Apply for this session non-default [23.37ms]
(pass) model selector profile red-team > activation credential error shows error and preserves active model, thinking, overrides, and default [11.98ms]
(pass) model selector profile red-team > profile names with unusual characters render without breaking the list [12.31ms]
(pass) model selector profile red-team > custom profile display names strip terminal control characters before rendering [10.85ms]
(pass) model selector profile red-team > Browse all models switches to flat model rows [12.67ms]
(pass) delete action restores the profile when post-delete notification fails [1.81ms]

::endgroup::

::group::packages/coding-agent/test/cli-args-mpreset.test.ts:
(pass) CLI model profile args > parses --mpreset with separate value [0.44ms]
(pass) CLI model profile args > parses --mpreset=value [0.06ms]
(pass) CLI model profile args > parses --default with --mpreset [0.05ms]
(pass) CLI model profile args > rejects --default without --mpreset [0.08ms]
(pass) CLI credential selector args > parses --credential with provider-qualified email selector [0.16ms]
(pass) CLI credential selector args > rejects --credential without selector [0.19ms]
(pass) CLI credential selector args > parses bare email credential selector as email shorthand [0.07ms]
(pass) CLI credential selector args > rejects malformed credential selector [0.06ms]
(pass) MCP config CLI args > parses absolute config paths in both supported syntaxes [0.06ms]
(pass) MCP config CLI args > rejects missing or non-absolute config paths [0.13ms]
(pass) MCP config CLI args > rejects repeated config paths in every supported syntax [0.13ms]
(pass) MCP config CLI args > rejects non-standalone config routes during parsing [0.10ms]
(pass) explicit CLI --model/--thinking are reapplied after --mpreset activation [1.07ms]
(pass) deferred explicit CLI --model is reapplied after --mpreset activation [0.48ms]
(pass) startup profile activation failure disposes the session before exit [0.78ms]
(pass) explicit CLI --model rebases the resumed session default chain [0.29ms]
(pass) startup model profiles apply the default profile before --mpreset [0.47ms]
(pass) persisted default thinking overrides startup default profile effort [0.42ms]
(pass) noninteractive startup keeps the exit-on-missing-credential contract [0.40ms]
(pass) credential recovery does not mask unrelated model-profile activation errors [0.29ms]
(pass) startup model-profile credential recovery eligibility > ordinary input-free interactive startup [0.07ms]
(pass) startup model-profile credential recovery eligibility > redirected stdin or stdout
(pass) startup model-profile credential recovery eligibility > print or text startup
(pass) startup model-profile credential recovery eligibility > explicit startup prompt
(pass) startup model-profile credential recovery eligibility > slash or positional startup message
(pass) startup model-profile credential recovery eligibility > image-only startup
(pass) startup model-profile credential recovery eligibility > automatic resume continuation
(pass) startup model-profile credential recovery eligibility > idle resume picker selection
(pass) root startup recovers a missing credential only for an input-free interactive route [0.44ms]
(pass) root startup keeps redirected terminal credential failures fatal [0.41ms]
(pass) root startup keeps print or text credential failures fatal [0.13ms]
(pass) root startup keeps explicit prompt credential failures fatal [0.17ms]
(pass) root startup keeps positional or slash input credential failures fatal [0.13ms]
(pass) root startup keeps image-only input credential failures fatal [0.11ms]
(pass) root startup keeps automatic resume continuation credential failures fatal [0.11ms]
(pass) recoverable blocked default still applies healthy --mpreset and explicit CLI override [0.52ms]
(pass) recoverable blocked --mpreset still reapplies explicit CLI override after a healthy default [0.44ms]
(pass) thinking-only startup uses authoritative override semantics [0.25ms]

::endgroup::

::group::packages/coding-agent/test/model-preset-landing-redteam-qa.test.ts:
(pass) preset landing adversarial QA > Escape closes exactly one preset layer in order [14.26ms]
(pass) preset landing adversarial QA > printable input exits preview/scope menu into seeded model search [12.64ms]
(pass) preset landing adversarial QA > up/down wraps at landing boundaries and Browse all preserves model role menu [13.29ms]
(pass) preset landing adversarial QA > temporaryOnly, initialSearchInput, and scoped models bypass preset landing [34.56ms]
(pass) preset landing adversarial QA > partial combo auth blocks selection and MiniMax hint uses canonical provider id only [23.40ms]
(pass) preset landing adversarial QA > COMBOS group stays available when at least one combo is usable [11.68ms]
(pass) preset landing adversarial QA > preview clamps codex eco executor to low and omits suffix for suffixless selector [24.68ms]
(pass) preset landing adversarial QA > built-in Codex Eco preview preserves the Terra and Luna role models [22.54ms]
(pass) preset landing adversarial QA > built-in Codex + OpenCodeGo preview preserves provider role models [22.14ms]
(pass) preset landing adversarial QA > #688 Down crossing a group boundary lands on the destination group header [12.18ms]
(pass) preset landing adversarial QA > #688 Down from a multi-profile group does not skip the destination header onto Browse [12.38ms]

::endgroup::

 78 pass
 0 fail
 242 expect() calls
Ran 78 tests across 4 files. [1.67s]
$ biome check . && bun run check:types
Checked 2347 files in 8s. No fixes applied.
$ tsc -p tsconfig.json --noEmit
[successor/model-preset-default-action-current 59d96368] feat(coding-agent): default preset selection to persistence
 3 files changed, 61 insertions(+), 25 deletions(-)
To https://github.com/twoimo/gajae-code
 ! [remote rejected]   HEAD -> successor/model-preset-default-action-current (refusing to allow a GitHub App to create or update workflow `.github/workflows/dev-ci.yml` without `workflows` permission)
error: failed to push some refs to 'https://github.com/twoimo/gajae-code'

…tones (rebase of Yeachan-Heo#3069) (Yeachan-Heo#3150)

* perf(coding-agent): skip lock acquisition for already-completed tombstones

Rebase of Yeachan-Heo#3069 (exact head 2b58273) onto
current dev.

`reconcileManagedTombstones` acquired a durable fsync-backed operation lock for
every tombstone in the scope, including tombstones whose targets had already
published a `cleanup_completed` receipt and therefore had nothing left to
reconcile. Scopes that accumulate many completed tombstones paid that cost on
every `gjc resume` and delete.

Skip the lock only when every target of the tombstone still satisfies the
identity-bound `cleanupCompleted` predicate, which verifies schema version,
state, scope digest, tombstone path, attempt, target path/sessionId/cwd, and the
full identity tuple (dev, ino, size, mtimeNs, sha256). Any target that fails the
predicate falls through to the existing locked reconciliation path unchanged, so
this is never a blanket skip.

Tests:
- untouched completed receipts -> zero lock acquisitions
- a completed receipt whose recorded target sha256 no longer matches -> lock is
  still acquired (negative control; fails if the skip is made unconditional)

* ci: re-trigger PR checks after GitHub Actions internal job failures

No product change. Previous Yeachan-Heo#3150 run failed with empty-step jobs annotated
as "GitHub Actions has encountered an internal error when running your job".

* ci: re-trigger PR checks after Actions recovery

No product change. Previous re-trigger landed in the GHA internal-error window
(empty-step jobs). Dev CI has since recovered on post-merge runs.

---------

Co-authored-by: Yeachan-Heo <yeachan-heo@gajae.dev>
@twoimo
twoimo force-pushed the successor/model-preset-default-action-current branch from fd98172 to f14e244 Compare July 25, 2026 14:09
twoimo added 2 commits July 25, 2026 14:10
…3073)

Owner-approved MERGE_READY at exact head ce4f799 with green CI (28 checks). Merged after post-Yeachan-Heo#3135/Yeachan-Heo#3150 sequencing: current free-merge after green on f14e244, with Yeachan-Heo#3150 already serial-merged to a11fd9f.
@github-actions

Copy link
Copy Markdown

MODEL_SUCCESSOR_VERIFIED

@github-actions
github-actions Bot force-pushed the successor/model-preset-default-action-current branch from af9f738 to b1684ff Compare July 25, 2026 14:14
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

6 participants